package com.crm.service.returnMoney;

import com.crm.common.model.DhPageInfo;
import com.crm.model.entity.finishOrderProduct.FinishOrderProduct;
import com.crm.model.entity.finishOrderProduct.PersonalPerformanceAnalysis;
import com.crm.model.vo.csd.product.sceneChangeCourseVO;
import com.crm.model.vo.customerManager.FinishOrderCustomerVO;
import com.crm.model.vo.finishOrderProduct.FinishOrderProductVO;
import com.crm.model.vo.productManager.AnalyseFinishOrderProductVO;
import com.crm.model.vo.productManager.ProductAnalyseVO;
import com.crm.model.vo.returnMoney.CustFinanceProductOderVO;
import com.crm.model.vo.returnMoney.ProductOfCustomerVO;

import java.math.BigDecimal;
import java.util.List;

/**
 * @Author: chaifuyou
 * @date 2021/3/26 9:20
 */
public interface FinishOrderDBservice {
    void addFinishOrderList(List<FinishOrderProduct> finishList);

    /**
     * 客户详情产品明细
     *
     * @param delState          删除状态  0
     * @param customerId        客户id
     * @param productCategories 产品分类 0:非会员;1:会员
     * @param order             分组类型
     * @return
     */
    List<CustFinanceProductOderVO> finishOrderProductList(short delState, String customerId, String productCategories, String order);

    /**
     * 客户详情产品明细
     *
     * @param delState   删除状态  0
     * @param customerId 客户id
     * @param order      分组类型
     * @return
     */
    List<CustFinanceProductOderVO> csdFinishOrderProductList(short delState, String customerId, String order);

    /**
     * 根据订单id查询会员产品信息
     *
     * @param delState
     * @param orderId
     * @return
     */
    List<CustFinanceProductOderVO> getMemberProductListByOrderId(short delState, String orderId, String productCategories);

    /**
     * 根据订单id清空产品
     *
     * @param productOrderId
     */
    void delOrderProductByOrderId(String productOrderId);

    /***
     * @Description:根据产品分类和订单id查询会员产品列表
     * @Param: productCategories 产品分类
     * @Param: orderId 订单id
     * @Author: luojie
     * @Date: 2021/4/16 8:40
     */
    List<FinishOrderProduct> selectFinishOrderProductList(String productCategories, String orderId);

    /**
     * 查询会员产品数量list
     *
     * @param dateUnit
     * @param accountId
     * @return
     */
    List<String> selectVipProductCountList(Integer dateUnit, String accountId, String startDate, String endDate);

    /**
     * 查询非会员产品数量list
     *
     * @param dateUnit
     * @param accountId
     * @return
     */
    List<String> selectProductCountList(Integer dateUnit, String accountId, String startDate, String endDate);

    /**
     * 查询产品额度list
     *
     * @param dateUnit
     * @param accountId
     * @return
     */
    List<String> selectProductPriceCountList(Integer dateUnit, String accountId, String startDate, String endDate);

    /**
     * 查询产品总数量、额度
     *
     * @param dateUnit
     * @param accountId
     * @param type
     * @return
     */
    ProductAnalyseVO selectProductCountAndPrice(Integer dateUnit, String accountId, int type, String startDate, String endDate);

    /**
     * 查询产品总数量、额度(查询finish表的)
     *
     * @param dateUnit
     * @param accountId
     * @param type
     * @return
     */
    ProductAnalyseVO queryFinishProductCountAndPrice(Integer dateUnit, String accountId, int type, String startDate, String endDate);

    /**
     * 订单完成的产品列表统计
     *
     * @param dateUnit
     * @param order
     * @param accountId
     * @return
     */
    List<AnalyseFinishOrderProductVO> selectAnalyseFinishOrderProductList(Integer dateUnit, StringBuilder order, String accountId);

    /**
     * 查询用户销售总额度
     *
     * @param dateUnit
     * @param accountId
     * @return
     */
    BigDecimal getUserProductPriceCount(Integer dateUnit, String accountId);

    /**
     * 客户详情产品等级
     *
     * @param delState          删除状态  0
     * @param customerId        客户id
     * @param productCategories 产品分类 0:非会员:1:会员
     * @return
     */
    Integer productMembershipLevel(short delState, String customerId, String productCategories);


    /**
     * @Description: 根据产品编码查询客户信息
     * @Param: [productCode]
     * @Return: java.util.List<com.crm.model.vo.customerManager.FinishOrderCustomerVO>
     * @Author: lixq-fs
     * @Date: 2021/6/2
     **/
    List<FinishOrderCustomerVO> selectCustomersByProductCode(String productCode, String accountId);


    /**
     * @Description: 根据客户id获取客户下产品信息
     * @Param: [customerId]
     * @Return: java.util.List<com.crm.model.vo.returnMoney.ProductOfCustomerVO>
     * @Author: lixq-f
     * @Date: 2021/6/3
     **/
    List<ProductOfCustomerVO> selectProductsByCustomerId(String customerId, String productCode);

    /**
     * 新增订单完成的产品
     *
     * @param finishOrderProduct 订单完成的产品
     * @return {@link {java.lang.Boolean}}
     * @Author pym
     * @Date 2021/6/4 15:12
     */
    Boolean insertFinishOrderProduct(FinishOrderProduct finishOrderProduct);


    /**
     * @Description: 根据非会员产品编号消费产品
     * @Param: [productNumLst]
     * @Return: void
     * @Author: lixq-f
     * @Date: 2021/6/11
     **/
    Boolean consumeNoMember(List<String> productNumLst);


    /**
     * @Description: 根据产品号列表查询产品
     * @Param: [productNumLst]
     * @Return: java.util.List<com.crm.model.vo.returnMoney.ProductOfCustomerVO>
     * @Author: lixq-f
     * @Date: 2021/6/11
     **/
    List<ProductOfCustomerVO> queryProductsByProductNumLst(List<String> productNumLst);


    /**
     * @Description: TODO
     * @Param: [finishOrderProductId, remainNum]
     * @Return: java.lang.Boolean
     * @Author: lixq-f
     * @Date: 2021/6/11
     **/
    Boolean updateServiceTimesById(String finishOrderProductId, int remainNum);

    /***
     * @Description:根据产品分类和订单id和订单明细类型--1:产品类型 查询会员产品列表
     * @Param: productCategories 产品分类
     * @Param: orderId 订单id
     * @Author: baijian
     * @Date: 2021/7/1 15:17
     */
    List<FinishOrderProduct> selectFinishOrderProductList(String orderDetailType, String productCategories, String orderId);


    /**
     * @Description: 通过产品编号获取产品
     * @Param: [productNum]
     * @Return: com.crm.model.entity.finishOrderProduct.FinishOrderProduct
     * @Author: lixq-f
     * @Date: 2021/7/21
     **/
    FinishOrderProduct getProductByProductNum(String productNum);


    /**
     * @Description: 根据产品号修改剩余服务次数
     * @Param: [productNum, remainNum]
     * @Return: java.lang.Boolean
     * @Author: lixq-f
     * @Date: 2021/7/21
     **/
    Boolean updateServiceTimesByProductNum(String productNum, int remainNum);

    /**
     * 新增
     *
     * @param finishOrderProduct
     */
    Integer insertFinishProduct(FinishOrderProduct finishOrderProduct);

    /**
     * 订单完成的产品表
     *
     * @param productOrderId 订单id
     * @param productCode    产品编码
     */
    List<FinishOrderProduct> selectFinshByOrderIdAndCode(String productOrderId, String productCode);

    /**
     * 修改完成订单的产品表,为删除状态
     *
     * @param finsh 产品表
     * @return
     */
    Boolean updateFinishOrderProduct(FinishOrderProduct finsh);


    /**
     * 通过订单id查询订单完成的产品
     *
     * @param orderId 订单id
     * @return
     */
    List<FinishOrderProduct> finishOrderBackProductList(String orderId);

    /**
     * 通过产品号查询订单下完成的产品
     *
     * @param finishOrderProductNum 产品号
     * @return
     */
    FinishOrderProduct selectFinshByProductNum(String finishOrderProductNum);

    /**
     * 根据订单id查询总业绩金额
     *
     * @param productOrderId
     * @return
     */
    BigDecimal selectGradeMoneyByOrderId(String productOrderId);

    /**
     * 查询业绩金额
     *
     * @param companyId
     * @param dateType
     * @return
     */
    BigDecimal selectGradeMoneyCount(String companyId, Integer dateType);


    /**
     * 业绩清单（主查finish表）
     *
     * @param dateUnit
     * @param order
     * @param accountId
     * @return
     */
    List<AnalyseFinishOrderProductVO> getPerformanceList(Integer dateUnit, StringBuilder order, String accountId);

    /**
     * 根据订单id查询提成金额
     *
     * @param orderId
     * @return
     */
    BigDecimal selectFinishOrderProductRoyaltyMoneyCountByOrderId(String orderId);

    FinishOrderProduct selectFinishOrderProductById(String finishOrderProductId);

    /**
     * 订单管理-订单列表-订单详情-产品详情
     *
     * @param productOrderId         -产品订单表主键
     * @param productOrderDetailType -订单明细类型--1:产品类型;2:活动类型;3:赠品活动类型;4:兑换类型;5:补款升级
     * @return {@link {java.util.List<com.crm.model.entity.finishOrderProduct.FinishOrderProduct>}}
     * @Author pym
     * @Date 2021/9/6 14:40
     */
    List<FinishOrderProduct> selectOrderDetailFinishOrderProductList(String productOrderId, String productOrderDetailType);

    void delFinishByOrderId(String productOrderId);

    /**
     * 通过订单id查询订单完成的产品
     *
     * @param orderId 订单id
     * @return
     */
    List<FinishOrderProduct> finishList(String orderId);


    List<FinishOrderProductVO> selectProductSceneList(String order, String customerId);

    Integer selectFinishProductCountByOrderId(String orderId);

    /***
     * @Description:根据主键更新finish表的产品兑换状态
     * @Param: finishOrderProductId 订单完成的产品表id
     * @Author: luojie
     * @Date: 2021/9/23 16:29
     */
    Boolean updateFinishOrderProductExchangeStatus(String finishOrderProductId, String exchangeStatus);

    /***
     * @Description:查询未兑换的产品列表
     * @Param:
     * @Author: luojie
     * @Date: 2021/9/23 16:40
     */
    List<FinishOrderProduct> selectNoExchangeFinishOrderProductListByOrderId(String orderDetailType, String productCategories, String orderId);

    /**
     * 清空订单下finish表回款数据
     *
     * @param productOrderId
     * @param accountId
     */
    void clearFinishReturnMoneyInfoByOrderId(String productOrderId, String accountId);

    /**
     * 根据订单id产品id查询finish表产品信息
     *
     * @param productId
     * @param productOrderId
     * @return
     */
    List<CustFinanceProductOderVO> selectFinishOrderProductByProductId(String productId, String productOrderId);

    /**
     * 修改全部字段
     *
     * @param finish
     */
    void updateFinishOrderProductAll(FinishOrderProduct finish);

    /**
     * 查询客户下的产品
     *
     * @param customerId 客户Id
     * @return
     */
    List<CustFinanceProductOderVO> selectProductByCustomerId(String customerId);

    DhPageInfo<PersonalPerformanceAnalysis> getPersonalPerformanceAnalysis(Integer pageIndex, Integer pageSize, String dateStr, String accountId);
}
